﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ServerFrame;
using Gameserver.DAO;
using System.Threading;


namespace Gameserver.Cache
{
    public class UserCache
    {
        public int userid = 0;//创建账号时的自增id（缓存中使用，数据库中使用另一个ID）
        public Dictionary<int,string> uidToName=new Dictionary<int,string>();//账号缓存，根据id查找名称（判断账号是否存在）
        public Dictionary<string, User_DAO> unameToUser = new Dictionary<string, User_DAO>();//账号缓存，根据名称查找账号（判断账号是否存在）
        public Dictionary<string, Mytoken> Online_Name = new Dictionary<string, Mytoken>();//账号缓存，根据名称查找对应token（用户）。（判断账号是否在线）
        public Dictionary<Mytoken, string> Online_Token = new Dictionary<Mytoken, string>();//账号缓存，根据token（用户）查找对应名称。（判断账号是否在线）
        /// <summary>
        /// 根据名称判断是否存在账号（先从缓存中判断，后查询数据库）
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public bool hasUser(string name)
        {
            if (uidToName.ContainsValue(name))
                return true;
            //todo 访问数据库，查找是否有该账户，若有，加入缓存中
            return false;
        }
        /// <summary>
        /// 根据名称判断账号是否在线
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public bool isOnline(string name)
        {
            if (Online_Name.ContainsKey(name))
                return true;
            return false;
        }
        public bool isOnline(Mytoken token)
        {
            if (Online_Token.ContainsKey(token))
                return true;
            return false;
        }
        /// <summary>
        /// 账号创建成功后，添加进数据库与缓存中
        /// </summary>
        /// <param name="name">名称</param>
        /// <param name="password">密码</param>
        public void Create(string name,string password)
        {
            User_DAO user = new User_DAO(userid, name, password);
            //添加进数据库与缓存中
            uidToName.Add(user.user_id, user.username);
            unameToUser.Add(user.username, user);
            Interlocked.Increment(ref userid);//保护线程安全，防止userid同时自增出现问题
        }
        /// <summary>
        /// 账号登陆后加入上线缓存
        /// </summary>
        /// <param name="name"></param>
        /// <param name="token"></param>
        public void Online(string name,Mytoken token)
        {
            Online_Name.Add(name, token);
            Online_Token.Add(token, name);
        }
        /// <summary>
        /// 账号下线，移除上线换成中的对应账号
        /// </summary>
        /// <param name="name"></param>
        /// <param name="token"></param>
        public void Offline(Mytoken token)
        {
            Online_Name.Remove(Online_Token[token]);
            Online_Token.Remove(token);
        }
        /// <summary>
        /// 判断密码是否正确
        /// </summary>
        /// <param name="name"></param>
        /// <param name="password"></param>
        /// <returns></returns>
        public bool Match(string name,string password)
        {
            return unameToUser[name].password.Equals(password);
        }

        public Mytoken GetTokenByName(string name)
        {
            if (Online_Name.ContainsKey(name))
                return Online_Name[name];
            return null;
        }
        public string GetNameByToken(Mytoken token)
        {
            if (Online_Token.ContainsKey(token))
                return Online_Token[token];
            return null;
        }
        public User_DAO GetUserByName(string name)
        {
            if(hasUser(name))
            {
                return unameToUser[name];
            }
            return null;
        }
        public User_DAO GetUserByToken(Mytoken token)
        {
            string name = Online_Token[token];
            return GetUserByName(name);
        }
        
    }
}
